import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GetSuperClassGenricTypeTest {

	public static void main(String[] args) {
		Test3 t1 = new Test3();
		System.out.println(t1.get());
	}

}



class Test3 extends Test1<String> {

}

class Test1<T> extends Test0<T> {
	private Class<T> persistentClass;

	@SuppressWarnings("unchecked")
	public Test1() {
		// this.persistentClass = (Class<T>) ((ParameterizedType)
		// getClass().getGenericSuperclass()).getActualTypeArguments()[0];
		this.persistentClass = (Class<T>) getSuperClassGenricType(getClass(), 0);
	}

	public String get() {
		return this.persistentClass.getName();
	}

	@SuppressWarnings("unchecked")
	public static Class<Object> getSuperClassGenricType(final Class clazz, final int index) {

		// 返回表示此 Class 所表示的实体（类、接口、基本类型或 void）的直接超类的 Type。
		Type genType = clazz.getGenericSuperclass();

		if (!(genType instanceof ParameterizedType)) {
			return Object.class;
		}
		// 返回表示此类型实际类型参数的 Type 对象的数组。
		Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

		if (index >= params.length || index < 0) {
			return Object.class;
		}
		if (!(params[index] instanceof Class)) {
			return Object.class;
		}

		return (Class) params[index];
	}

}

class Test0<T> {

}